#pragma once

#include "lims/entities/Point.hpp"
#include <cmath>

using namespace std;

namespace MetricSpaceBenchmark::MLIndex::LIMS {
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
    class CalCirclePos {
    private:
        unsigned dim;
    public:
        double dis_upper;
        double dis_lower;
        /*
         *  1 ：外切+外离
         *  2 ：相交
         *  3 ：内含
         */
        unsigned label;
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
        /*
         * @refPt: 参考点,表示一个圆的圆心
         * @radius_refPt: 参考点所代表圆的半径
         * @queryPt: 查询点, 表示第二个圆的圆心
         * @radius_queryPt: 查询点所代表圆的半径
         */
        CalCirclePos(Point &refPt, double radius_refPt, Point &queryPt, double radius_queryPt) {
            this->dim = refPt.coordinate.size();
            double distance = CalDisOfPt(refPt, queryPt);
            // 外切+外离
            if (distance >= radius_refPt + radius_queryPt) {
                this->label = 1;
                this->dis_lower = 0x3f3f3f;  // 设置为一个很大的值(0x3f3f3f),表示没有实际的上下界
                this->dis_upper = 0x3f3f3f;
            } else if (distance >= fabs(radius_refPt - radius_queryPt)) {
                this->label = 2;
                if (distance > radius_queryPt) {    // 没有把参考点圆心包进去
                    this->dis_upper = radius_refPt;
                    this->dis_lower = distance - radius_queryPt;
                } else {    // 把参考点圆心包进去了
                    this->dis_lower = 0.0;
                    this->dis_upper = radius_refPt;
                }
            } else {
                this->label = 3;
                if (distance > radius_queryPt) {
                    this->dis_lower = distance - radius_queryPt;
                    this->dis_upper = distance + radius_queryPt;
                } else {
                    this->dis_upper = distance + radius_queryPt;
                    this->dis_lower = 0.0;
                }
            }
        }

////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
        // 计算两个点之间的欧氏距离
        double CalDisOfPt(Point &point_a, Point &point_b) const {
            double total = 0.0;
            for (unsigned i = 0; i < dim; i++) {
                total += pow(point_a.coordinate[i] - point_b.coordinate[i], 2);
            }
            return sqrt(total);
        }

////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
        CalCirclePos() = default;

        ~CalCirclePos() = default;
    };
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
}


